From 6887d0ce2467a5909f1b8c2255f77d5cdb53ca60 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 18 Sep 2020 09:15:03 +0200 Subject: [PATCH] glrenderer: Move ProgramState into Program There is no real reason to have this on the side indexed via the index, as it is stored next to each other anyway. Plus, storing them together lets use use `Program` structures not in the array. --- gsk/gl/gskglrenderer.c | 4 +- gsk/gl/gskglrenderops.c | 8 +-- gsk/gl/gskglrenderopsprivate.h | 107 +++++++++++++++++---------------- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 1181ca0609..a465bcfd79 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -2919,7 +2919,7 @@ gsk_gl_renderer_programs_new (void) programs->ref_count = 1; for (i = 0; i < GL_N_PROGRAMS; i ++) { - programs->state[i].opacity = 1.0f; + programs->programs[i].state.opacity = 1.0f; } return programs; @@ -2944,7 +2944,7 @@ gsk_gl_renderer_programs_unref (GskGLRendererPrograms *programs) { if (programs->programs[i].id > 0) glDeleteProgram (programs->programs[i].id); - gsk_transform_unref (programs->state[i].modelview); + gsk_transform_unref (programs->programs[i].state.modelview); } g_free (programs); } diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c index c3ffce648d..9f5b6718d1 100644 --- a/gsk/gl/gskglrenderops.c +++ b/gsk/gl/gskglrenderops.c @@ -60,7 +60,7 @@ get_current_program_state (RenderOpBuilder *builder) if (!builder->current_program) return NULL; - return &builder->programs->state[builder->current_program->index]; + return &builder->current_program->state; } void @@ -218,10 +218,10 @@ ops_free (RenderOpBuilder *builder) void ops_set_program (RenderOpBuilder *builder, - const Program *program) + Program *program) { OpProgram *op; - ProgramState *program_state; + ProgramState *program_state = NULL; if (builder->current_program == program) return; @@ -231,7 +231,7 @@ ops_set_program (RenderOpBuilder *builder, builder->current_program = program; - program_state = &builder->programs->state[program->index]; + program_state = &program->state; if (memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0) { diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h index b2a574a401..728fbfbffe 100644 --- a/gsk/gl/gskglrenderopsprivate.h +++ b/gsk/gl/gskglrenderopsprivate.h @@ -31,6 +31,57 @@ typedef struct OpsMatrixMetadata metadata; } MatrixStackEntry; +typedef struct +{ + GskTransform *modelview; + GskRoundedRect clip; + graphene_matrix_t projection; + int source_texture; + graphene_rect_t viewport; + float opacity; + /* Per-program state */ + union { + GdkRGBA color; + struct { + graphene_matrix_t matrix; + graphene_vec4_t offset; + } color_matrix; + struct { + float widths[4]; + GdkRGBA color; + GskRoundedRect outline; + } border; + struct { + GskRoundedRect outline; + float dx; + float dy; + float spread; + GdkRGBA color; + } inset_shadow; + struct { + GskRoundedRect outline; + float dx; + float dy; + float spread; + GdkRGBA color; + } unblurred_outset_shadow; + struct { + int n_color_stops; + GskColorStop color_stops[GL_MAX_GRADIENT_STOPS]; + float start_point[2]; + float end_point[2]; + } linear_gradient; + struct { + int n_color_stops; + GskColorStop color_stops[GL_MAX_GRADIENT_STOPS]; + float center[2]; + float start; + float end; + float radius[2]; /* h/v */ + } radial_gradient; + }; +} ProgramState; + struct _Program { int index; /* Into the renderer's program array */ @@ -109,59 +160,9 @@ struct _Program int texture_rect_location; } repeat; }; + ProgramState state; }; -typedef struct -{ - GskTransform *modelview; - GskRoundedRect clip; - graphene_matrix_t projection; - int source_texture; - graphene_rect_t viewport; - float opacity; - /* Per-program state */ - union { - GdkRGBA color; - struct { - graphene_matrix_t matrix; - graphene_vec4_t offset; - } color_matrix; - struct { - float widths[4]; - GdkRGBA color; - GskRoundedRect outline; - } border; - struct { - GskRoundedRect outline; - float dx; - float dy; - float spread; - GdkRGBA color; - } inset_shadow; - struct { - GskRoundedRect outline; - float dx; - float dy; - float spread; - GdkRGBA color; - } unblurred_outset_shadow; - struct { - int n_color_stops; - GskColorStop color_stops[GL_MAX_GRADIENT_STOPS]; - float start_point[2]; - float end_point[2]; - } linear_gradient; - struct { - int n_color_stops; - GskColorStop color_stops[GL_MAX_GRADIENT_STOPS]; - float center[2]; - float start; - float end; - float radius[2]; /* h/v */ - } radial_gradient; - }; -} ProgramState; - typedef struct { int ref_count; union { @@ -189,7 +190,7 @@ typedef struct { typedef struct { GskGLRendererPrograms *programs; - const Program *current_program; + Program *current_program; int current_render_target; int current_texture; @@ -236,7 +237,7 @@ void ops_pop_modelview (RenderOpBuilder *builder); float ops_get_scale (const RenderOpBuilder *builder); void ops_set_program (RenderOpBuilder *builder, - const Program *program); + Program *program); void ops_push_clip (RenderOpBuilder *builder, const GskRoundedRect *clip); -- 2.30.2